package com.echo.im.repository.dao.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.echo.im.repository.dao.entity.GroupMember;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;

/**
 * 群成员Mapper接口
 *
 * @author echo
 * @date 2024-08-17
 */
public interface GroupMemberMapper extends BaseMapper<GroupMember> {

    /**
     * 查询指定群组和用户的最后ack消息ID
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 最后ack消息ID
     */
    Long selectLastAckMessageIdByGroupIdAndUserId(@Param("groupId") Long groupId, @Param("userId") Long userId);

    /**
     * 查询指定群组的所有用户ID列表
     *
     * @param groupId 群组ID
     * @return 用户ID列表
     */
    List<Long> selectUserIdListByGroupId(@Param("groupId") Long groupId);

    /**
     * 查询指定群组和用户的成员记录
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 成员记录
     */
    GroupMember selectOneByGroupIdAndUserId(@Param("groupId") Long groupId, @Param("userId") Long userId);

    /**
     * 查询指定群组的所有成员
     *
     * @param groupId 群组ID
     * @return 成员记录列表
     */
    List<GroupMember> selectListByGroupId(@Param("groupId") Long groupId);

    /**
     * 删除指定群组的所有成员
     *
     * @param groupId 群组ID
     */
    void deleteByGroupId(@Param("groupId") Long groupId);

    /**
     * 更新指定群组和用户的最后ack消息ID
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param lastAckMessageId 最后ack消息ID
     */
    void updateLastAckMessageIdByGroupIdAndUserId(@Param("groupId") Long groupId, @Param("userId") Long userId, @Param("lastAckMessageId") Long lastAckMessageId);

    /**
     * 查询指定用户的所有群组成员记录
     *
     * @param userId 用户ID
     * @return 成员记录列表
     */
    List<GroupMember> selectListByUserId(@Param("userId") Long userId);

    /**
     * 查询指定用户在一个月内退出的群组成员记录
     *
     * @param userId 用户ID
     * @return 退出的成员记录列表
     */
    Collection<? extends GroupMember> selectQuitInMonth(@Param("userId") Long userId);

    /**
     * 删除指定群组和用户的成员记录
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     */
    void deleteByGroupIdAndUserId(@Param("groupId") Long groupId, @Param("userId") Long userId);

    /**
     * 查询群组中已读消息的用户ID列表
     * @param groupId 群组ID
     * @param msgId 消息ID
     *
     * @return 用户ID列表
     */
    List<Long> selectReadedUserIds(@Param("groupId")Long groupId,@Param("msgId") Long msgId);
}

